JAVA如何调用C/C++动态库

您所在的位置:网站首页 java 动态库调用 JAVA如何调用C/C++动态库

JAVA如何调用C/C++动态库

2023-10-25 06:07| 来源: 网络整理| 查看: 265

一、调用方式:

JAVA调用C/C++动态库有很多方法,常用的有JNI(Java Native Interface)、JNA(Java Native Access)。

JNI:早在JAVA1.1版本就开始支持,它定义了一种公用的语法,当java和c/c++双方都遵循该语法时,可以互相调用。所以使用JNI不能直接调用一般的C/C++库,而必须借助于一个中间动态库,该中间动态库实现了JAVA-JNI语法-C/C++的转换(或者你所调用的动态库原生就封装了JNI)。如果对C++稍微懂一点,其实使用起来也不难。

作者:宋清日 链接:https://zhuanlan.zhihu.com/p/465601205 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。  

java通过JNI(Java Native Interface)与其他语言编写的代码进行交互。

JNI工作示意图(网上下载的)

Java要调用第三方动态库,通俗点说就是需要将这个第三方动态库按照Java语言的要求再封装一次,变成Java可以调用的新动态库,这个新动态库去调用原始的动态库。

编写带有native声明的方法的Java类,该方法要与真正调用的动态库的方法和参数和返回值均一致。(直接用IDEA新建Java项目) package com.JniDemo; public class JniDemo { static { System.load("/root/Jni_Lib/libJniDemo.so"); } public native int add(int a, int b); public native String print(String msg); public static void main(String[] args) { JniDemo demo = new JniDemo(); demo.print("11"); } }

2. 编译Java类生成.class文件。(build一下创建的project)

3. 使用javah生成JNI头文件。

每次头文件有改动的话,直接用工具重新生成,比较方便。

4. 拿到生成的头文件。

/* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class com_JniDemo_JniDemo */ #ifndef _Included_com_JniDemo_JniDemo #define _Included_com_JniDemo_JniDemo #ifdef __cplusplus extern "C" { #endif /* * Class: com_JniDemo_JniDemo * Method: add * Signature: (II)I */ JNIEXPORT jint JNICALL Java_com_JniDemo_JniDemo_add (JNIEnv *, jobject, jint, jint); /* * Class: com_JniDemo_JniDemo * Method: print * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_JniDemo_JniDemo_print (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif

以上就完成JNI头文件的生成,在小编看来上面这些步骤Linux与window都一样,都是生成了Java可以调用的C++头文件,至于后面调用window的dll库或者Linux上的so库,才会有区别。

5. 新建C++动态库项目(Linux)

新建的动态库项目首先要包含三个文件,首先就是生成的JNI头文件com_JniDemo_JniDemo.h,另外两个是jni.h(在JDK目录的include目录下,/usr/java/jdk1.8.0201/include/jni.h)和 jni_md.h(在JDK目录的include的linux目录下,/usr/java/jdk1.8.0_201/include/linux/jni_md.h)。

后面两个文件可以直接复制到你的动态库项目里面,不用再配置文件路径了,比较方便,另外一个小细节可以注意一下,com_JniDemo_JniDemo.h文件中包含jni.h头文件的时候用的是#include , 如果把文件考到项目中,则需要改成#include "jni.h"。

6. 新建JniDemo.cpp文件,编译生成动态库。

#include "com_JniDemo_JniDemo.h" #include #include using namespace std; JNIEXPORT jint JNICALL Java_com_JniDemo_JniDemo_add (JNIEnv *env, jobject job, jint a, jint b) { jint c; c = a + b; return c; } JNIEXPORT jstring JNICALL Java_com_JniDemo_JniDemo_print (JNIEnv * env, jobject job, jstring s) { char str[] = "welcome"; std::string hello = "hello form c++"; cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3